const express = require('express');
const cors = require('cors');
const bodyParser = require('body-parser');
const path = require('path');
const fs = require('fs').promises;
const axios = require('axios');
require('dotenv').config();

const app = express();
const PORT = process.env.PORT || 3000;

// 中间件
app.use(cors());
app.use(bodyParser.json());
app.use(express.static('public'));

// 数据存储（实际项目中应使用数据库）
let storyChoices = [];
let aiWordHistory = [];
let magicHistory = [];

// 工具函数
function generateStory(keyword) {
    const storyTemplates = [
        `在${keyword}的夜晚，一只猫悄悄跃上屋顶，仰望星空，仿佛在思考宇宙的奥秘。`,
        `你走进${keyword}，发现一扇通往未来的门，门后是无数未知的可能。`,
        `传说中，${keyword}里藏着一颗会发光的宝石，只有勇敢者才能找到它。`,
        `在${keyword}的尽头，有一棵会说话的树，树下埋藏着古老的秘密。`,
        `每当${keyword}降临，城市的灯光就会变成五彩斑斓的梦。`,
        `在${keyword}的世界里，时间变得缓慢，每一刻都充满了魔法。`,
        `你遇见了一个来自${keyword}的神秘生物，它教会了你新的技能。`,
        `${keyword}中隐藏着一个古老的预言，关于世界的未来。`
    ];
    return storyTemplates[Math.floor(Math.random() * storyTemplates.length)];
}

function generateImageUrl(keyword) {
    // 使用Unsplash API生成图片
    return `https://source.unsplash.com/400x300/?${encodeURIComponent(keyword)},fantasy,art`;
}

function transformText(text, type) {
    switch (type) {
        case 'scroll':
            return `『${text.split('').join('·')}』\n——中世纪卷轴`;
        case 'binary':
            return text.split('').map(c => c.charCodeAt(0).toString(2).padStart(8, '0')).join(' ');
        case 'emoji':
            const emojis = ['🌟', '✨', '🦄', '🐉', '🧩', '🎲', '🪄', '🦕', '🦖', '🌈', '🔮', '🧠', '💡', '🎭', '🦋', '🍀', '🧸', '🎨', '🚀', '🪐'];
            return text.split('').map(c => emojis[(c.charCodeAt(0) + c.length) % emojis.length]).join('');
        case 'reverse':
            return text.split('').reverse().join('');
        case 'leet':
            const map = { 'a': '4', 'e': '3', 'i': '1', 'o': '0', 's': '5', 't': '7', 'A': '4', 'E': '3', 'I': '1', 'O': '0', 'S': '5', 'T': '7' };
            return text.split('').map(c => map[c] || c).join('');
        default:
            return text;
    }
}

// OpenAI API集成（需要API密钥）
async function generateWithOpenAI(prompt, type = 'story') {
    if (!process.env.OPENAI_API_KEY) {
        throw new Error('OpenAI API密钥未配置');
    }

    try {
        const response = await axios.post('https://api.openai.com/v1/chat/completions', {
            model: 'gpt-3.5-turbo',
            messages: [
                {
                    role: 'system',
                    content: type === 'story' 
                        ? '你是一个富有想象力的故事创作者，请根据关键词创作一个有趣的微小说。'
                        : '你是一个创意文字魔术师，请将文字转换成指定的风格。'
                },
                {
                    role: 'user',
                    content: prompt
                }
            ],
            max_tokens: 200,
            temperature: 0.8
        }, {
            headers: {
                'Authorization': `Bearer ${process.env.OPENAI_API_KEY}`,
                'Content-Type': 'application/json'
            }
        });

        return response.data.choices[0].message.content;
    } catch (error) {
        console.error('OpenAI API调用失败:', error);
        throw error;
    }
}

// 路由

// 健康检查
app.get('/api/health', (req, res) => {
    res.json({ status: 'ok', timestamp: new Date().toISOString() });
});

// 故事选择保存
app.post('/api/story/choice', (req, res) => {
    try {
        const { storyId, branchId, choice } = req.body;
        const choiceRecord = {
            id: Date.now(),
            storyId,
            branchId,
            choice,
            timestamp: new Date().toISOString()
        };
        storyChoices.push(choiceRecord);
        res.json({ success: true, choice: choiceRecord });
    } catch (error) {
        res.status(500).json({ error: '保存故事选择失败' });
    }
});

// 获取故事统计
app.get('/api/story/stats', (req, res) => {
    try {
        const stats = {
            totalChoices: storyChoices.length,
            uniqueStories: new Set(storyChoices.map(c => c.storyId)).size,
            recentChoices: storyChoices.slice(-10)
        };
        res.json(stats);
    } catch (error) {
        res.status(500).json({ error: '获取统计失败' });
    }
});

// AI词生万物生成
app.post('/api/aiword/generate', async (req, res) => {
    try {
        const { keyword } = req.body;
        
        if (!keyword) {
            return res.status(400).json({ error: '关键词不能为空' });
        }

        let story;
        let imageUrl;

        // 尝试使用OpenAI生成故事
        try {
            story = await generateWithOpenAI(`请根据关键词"${keyword}"创作一个有趣的微小说，字数控制在100字以内。`, 'story');
        } catch (error) {
            // 如果OpenAI失败，使用本地生成
            story = generateStory(keyword);
        }

        // 生成图片URL
        imageUrl = generateImageUrl(keyword);

        const result = {
            keyword,
            story,
            imageUrl,
            timestamp: new Date().toISOString()
        };

        // 保存到历史
        aiWordHistory.unshift(result);
        if (aiWordHistory.length > 50) {
            aiWordHistory = aiWordHistory.slice(0, 50);
        }

        res.json(result);
    } catch (error) {
        console.error('生成AI内容失败:', error);
        res.status(500).json({ error: '生成失败，请稍后重试' });
    }
});

// 保存AI作品
app.post('/api/aiword/save', (req, res) => {
    try {
        const { keyword, story, imageUrl } = req.body;
        const savedWork = {
            id: Date.now(),
            keyword,
            story,
            imageUrl,
            timestamp: new Date().toISOString()
        };
        aiWordHistory.unshift(savedWork);
        res.json({ success: true, work: savedWork });
    } catch (error) {
        res.status(500).json({ error: '保存失败' });
    }
});

// 获取AI作品历史
app.get('/api/aiword/history', (req, res) => {
    try {
        res.json({ history: aiWordHistory });
    } catch (error) {
        res.status(500).json({ error: '获取历史失败' });
    }
});

// 文字魔术变换
app.post('/api/magic/transform', async (req, res) => {
    try {
        const { text, type } = req.body;
        
        if (!text) {
            return res.status(400).json({ error: '文本不能为空' });
        }

        let result;

        // 尝试使用OpenAI进行高级变换
        try {
            const prompt = `请将文本"${text}"转换成${type}风格。`;
            result = await generateWithOpenAI(prompt, 'magic');
        } catch (error) {
            // 如果OpenAI失败，使用本地变换
            result = transformText(text, type);
        }

        const magicRecord = {
            id: Date.now(),
            originalText: text,
            transformedText: result,
            type,
            timestamp: new Date().toISOString()
        };

        magicHistory.unshift(magicRecord);
        if (magicHistory.length > 100) {
            magicHistory = magicHistory.slice(0, 100);
        }

        res.json({ result, record: magicRecord });
    } catch (error) {
        console.error('文字变换失败:', error);
        res.status(500).json({ error: '变换失败，请稍后重试' });
    }
});

// 获取魔术历史
app.get('/api/magic/history', (req, res) => {
    try {
        res.json({ history: magicHistory });
    } catch (error) {
        res.status(500).json({ error: '获取历史失败' });
    }
});

// 数据导出
app.get('/api/export', (req, res) => {
    try {
        const data = {
            storyChoices,
            aiWordHistory,
            magicHistory,
            exportTime: new Date().toISOString()
        };
        res.json(data);
    } catch (error) {
        res.status(500).json({ error: '导出失败' });
    }
});

// 数据导入
app.post('/api/import', (req, res) => {
    try {
        const { storyChoices: newChoices, aiWordHistory: newHistory, magicHistory: newMagic } = req.body;
        
        if (newChoices) storyChoices = newChoices;
        if (newHistory) aiWordHistory = newHistory;
        if (newMagic) magicHistory = newMagic;
        
        res.json({ success: true, message: '数据导入成功' });
    } catch (error) {
        res.status(500).json({ error: '导入失败' });
    }
});

// 错误处理中间件
app.use((error, req, res, next) => {
    console.error('服务器错误:', error);
    res.status(500).json({ error: '服务器内部错误' });
});

// 404处理
app.use((req, res) => {
    res.status(404).json({ error: '接口不存在' });
});

// 启动服务器
app.listen(PORT, () => {
    console.log(`🚀 灵感发生器API服务器运行在 http://localhost:${PORT}`);
    console.log(`📖 API文档: http://localhost:${PORT}/api/health`);
    console.log(`🌐 前端页面: http://localhost:${PORT}/M.html`);
});

module.exports = app; 